用wxpython製作鬧鐘程序

功能需求

鬧鐘

  • 貪睡功能

倒計時

  • 自動重複
  • 彈窗提醒

碼表

通用功能

  • 自訂鬧鈴聲音

開發環境

1
2
python 2.7
wxpython

思路心得

主程序 Frame

程序內的Label、button等都是透過座標做定位,如果程序視窗最大化將會破壞佈局,所以在Frame style選擇中不顯示”視窗最大化”按鈕。

1
wx.Frame.__init__(self...,style=wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.TAB_TRAVERSAL)

佈局

功能上由於是透過下拉選單來選擇,所以佈局上都是透過Show or Hide來顯示對應功能的對象。

1
2
3
4
5
6
7
8
9
self.Label_Stopwatch = wx.StaticText(self, wx.ID_ANY, u"00:00:00", (35, 90), wx.Size(200, 40), wx.TE_CENTRE)
self.Label_SWcontent = wx.StaticText(self, wx.ID_ANY, u"", (110, 200), wx.Size(60, 85), wx.ST_NO_AUTORESIZE)

self.GroupSW = [
self.Label_Stopwatch,
self.Label_SWcontent
]

[i.Hide() for i in self.GroupSW]

定時器

主要功能核心”定時器 Timer”,創建定時器時需要為定時器綁定一個event函數,再來可以根據情況設定運行時間(例如:一秒),默認會是循環運行(每隔一秒),也可設定參數只執行一次,在循環運行過程中也可以被按鈕事件觸發停止運行。

  • 系統時間定時器

在創建程序時先執行每1秒獲取電腦時間的定時器,鬧鐘及倒計時功能都是與系統時間比對後實現的。

1
2
3
4
5
6
7
8
9

def _OnRefresh(self, event):
NowTime = time.strftime("%Y/%m/%d %H:%M:%S")
self.Label_Nowtime.SetLabel(NowTime)


self.timer1 = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self._OnRefresh, self.timer1)
self.timer1.Start(1000)

倒計時功能

相比鬧鐘功能,倒計時在設計上不能以減一秒的方式進行判斷,由於在每次判斷都有毫秒差,時間一長就有分秒差,原先設定倒計時5分鐘的循環到後面提醒的時間將會越來越快。

因此判斷上必須將”倒數時間+當前時間”設一個end變數,每隔一秒的判斷其實就是end減當前時間,如果有自動重複功能 也是end變數加上設定的倒數時間,這樣才不會有誤差。

1
2
3
4
5
6
7
8
# 設定時間加上當前時間
self.CDendtime = datetime.datetime.now() + datetime.timedelta(hours=int(h), minutes=int(m), seconds=int(s))

# end變數減當前時間
diff = self.CDendtime - datetime.datetime.now()

if diff.total_seconds() <= 0:
print("時間到~響鈴")

Dialog

Dialog對話彈窗,設定檔案路徑及提醒訊息,透過event呼叫的wx.Dialog,再將設定的值傳回類。

1
2
3
4
5
6
7
8
9
def OnBeepSetting(self, event):
dlg = wx.FileDialog(self, u" 聲音檔案路徑 ", wildcard="Wav files (*.wav)|*.wav")
if dlg.ShowModal() == wx.ID_OK:
self.Sound = wx.Sound(dlg.Path)

dlg.Destroy()

self.menuSetting = wx.MenuItem(self.Menu, 1, u" 鬧鈴聲音 ", help="")
self.Bind(wx.EVT_MENU, self.OnBeepSetting, id=1)

源碼地址